package com.yww.leetcode2.linkedlist;

import com.yww.leetcode.common.ListNode;

/**
 * @author yww
 * @description 707. 设计链表
 * @since 2024/11/11
 */
public class MyLinkedList707_02 {
    ListNode dummyHead;
    Integer size;

    public MyLinkedList707_02() {
        dummyHead = new ListNode(-1, null);
        size = 0;
    }

    // 获取链表中下标为 index 的节点的值。如果下标无效，则返回 -1 。
    public int get(int index) {
        if (size == 0 || index >= size) {
            return -1;
        }
        ListNode cur = dummyHead.next;
        while (index > 0 && cur.next != null) {
            cur = cur.next;
            index--;
        }
        return cur.val;
    }

    //  将一个值为 val 的节点插入到链表中第一个元素之前。在插入完成后，新节点会成为链表的第一个节点。
    public void addAtHead(int val) {
        addAtIndex(0,val);
    }

    //  将一个值为 val 的节点追加到链表中作为链表的最后一个元素。
    public void addAtTail(int val) {
        ListNode newNode = new ListNode(val, null);
        ListNode cur = dummyHead;
        while (cur.next != null) {
            cur = cur.next;
        }
        newNode.next = cur.next;
        cur.next = newNode;
        size++;
    }

    // 将一个值为 val 的节点插入到链表中下标为 index 的节点之前。
    // 如果 index 等于链表的长度，那么该节点会被追加到链表的末尾。
    // 如果 index 比长度更大，该节点将 不会插入 到链表中。
    public void addAtIndex(int index, int val) {
        if (index > size) {
            return;
        }
        ListNode newNode = new ListNode(val, null);
        ListNode cur = dummyHead;
        while (index > 0 && cur.next != null) {
            cur = cur.next;
            index--;
        }
        newNode.next = cur.next;
        cur.next = newNode;
        size++;
    }

    // 如果下标有效，则删除链表中下标为 index 的节点。
    public void deleteAtIndex(int index) {
        if (isEmpty() || index >= size) {
            return;
        }
        ListNode cur = dummyHead;
        while (index > 0 && cur.next != null) {
            cur = cur.next;
            index--;
        }
        if (cur.next != null) {
            cur.next = cur.next.next;
            size--;
        }
    }
    public boolean isEmpty(){
        return size == 0;
    }

    public static void main(String[] args) {
        MyLinkedList707_02 myLinkedList7077 = new MyLinkedList707_02();
        myLinkedList7077.addAtHead(1);
        myLinkedList7077.addAtTail(3);
        myLinkedList7077.addAtIndex(1, 2);
        System.out.println(myLinkedList7077.get(1));
        myLinkedList7077.deleteAtIndex(1);
        System.out.println(myLinkedList7077.get(1));
        System.out.println(myLinkedList7077.get(3));
        System.out.println(myLinkedList7077.get(3));

    }
}
